#ifndef SIGNATURELABEL_H
#define SIGNATURELABEL_H

#include <QLabel>
#include <QMouseEvent>
#include <QPixmap>
#include <QPen>
#include <QPainterPath>
#include <QStack>

/**
 * @class SignatureLabel
 * @brief 高性能签名组件，支持商业级签名需求
 *
 * 这个类提供了一个专业的签名区域，支持平滑曲线绘制、撤销/重做操作、
 * 多种画笔样式选择和高分辨率输出等功能。特别适合需要电子签名的应用场景。
 *
 * 功能特点：
 * 1. 高性能矢量绘图，支持平滑曲线
 * 2. 完整的撤销/重做功能栈
 * 3. 多种画笔样式和背景设置
 * 4. 高DPI屏幕自适应
 * 5. 签名区域裁剪和透明背景支持
 * 6. 矢量路径输出
 */
class SignatureLabel : public QLabel
{
    Q_OBJECT
public:
    /// @brief 画笔样式枚举
    enum PenStyle {
        SolidLine = Qt::SolidLine,   ///< 实线
        DashLine = Qt::DashLine,     ///< 虚线
        DotLine = Qt::DotLine,       ///< 点线
        DashDotLine = Qt::DashDotLine ///< 点划线
    };

    /**
     * @brief 构造函数
     * @param parent 父部件指针
     */
    explicit SignatureLabel(QWidget *parent = nullptr);

    /// @brief 析构函数
    virtual ~SignatureLabel() override;

    // 画笔设置接口

    /**
     * @brief 设置画笔颜色
     * @param color 新的画笔颜色
     */
    void setPenColor(const QColor &color);

    /**
     * @brief 设置画笔宽度
     * @param width 新的画笔宽度（1-20像素）
     */
    void setPenWidth(int width);

    /**
     * @brief 设置画笔样式
     * @param style 画笔样式（实线、虚线等）
     */
    void setPenStyle(PenStyle style);

    /**
     * @brief 设置路径平滑级别
     * @param level 平滑级别（0-5，0表示不平滑，5表示最大平滑）
     *
     * 平滑算法使用Catmull-Rom样条曲线，级别越高曲线越光滑但计算量越大。
     * 平滑处理在鼠标释放时应用。
     */
    void setSmoothingLevel(int level);

    // 获取画笔属性接口

    /// @brief 获取当前画笔颜色
    QColor penColor() const;

    /// @brief 获取当前画笔宽度
    int penWidth() const;

    /// @brief 获取当前画笔样式
    PenStyle penStyle() const;

    // 背景设置接口

    /**
     * @brief 设置背景颜色
     * @param color 新的背景颜色
     *
     * 如果背景设置为透明，此颜色将被忽略
     */
    void setBackgroundColor(const QColor &color);

    /**
     * @brief 设置背景透明
     * @param transparent true表示透明背景，false表示使用背景色
     */
    void setBackgroundTransparent(bool transparent);

    /// @brief 获取当前背景颜色
    QColor backgroundColor() const;

    /// @brief 检查背景是否透明
    bool isBackgroundTransparent() const;

    // 签名操作接口

    /**
     * @brief 获取签名图像
     * @param cropped 是否裁剪到签名区域（默认为true）
     * @return 签名图像
     *
     * 此方法返回高DPI兼容的图像，自动适配设备像素比。
     * 当cropped为true时，会裁剪掉空白区域并添加15%边距。
     */
    QPixmap signatureImage(bool cropped = true) const;

    /**
     * @brief 获取超高质量签名图像
     * @return 4倍分辨率的签名图像
     *
     * 此方法生成高分辨率图像，适合打印或放大查看。
     * 图像会裁剪到签名区域并添加20%边距。
     */
    QImage  signatureImageHQ() const;

    /**
     * @brief 获取矢量路径
     * @return 包含所有笔画的矢量路径
     *
     * 此路径可以用于SVG导出或其他矢量操作。
     */
    QPainterPath signaturePath() const;

    /// @brief 清除签名内容
    void clearSignature();

    /// @brief 撤销上一个笔画
    void undo();

    /// @brief 重做上一个撤销的笔画
    void redo();

    /// @brief 检查是否可以撤销
    bool isUndoAvailable() const;

    /// @brief 检查是否可以重做
    bool isRedoAvailable() const;

    /// @brief 检查是否有签名内容
    bool hasSignature() const;

signals:
    /// @brief 签名内容变化信号
    void signatureChanged();

    /// @brief 撤销状态变化信号
    void undoStateChanged();

protected:
    // 事件处理函数
    void mousePressEvent(QMouseEvent *ev) override;
    void mouseMoveEvent(QMouseEvent *ev) override;
    void mouseReleaseEvent(QMouseEvent *ev) override;
    void paintEvent(QPaintEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

private:
    // 内部数据结构
    /// @brief 表示单个笔画的结构
    struct SignatureStroke {
        QPainterPath path; ///< 笔画路径
        QPen pen;          ///< 笔画使用的画笔
    };

    // 绘图辅助函数

    /**
     * @brief 初始化画布
     *
     * 根据设备像素比创建高分辨率画布，并填充背景。
     */
    void initCanvas();

    /**
     * @brief 渲染到画布
     *
     * 将所有笔画绘制到内部画布上（双缓冲技术）。
     */
    void renderToCanvas();

    /**
     * @brief 计算签名边界
     * @return 签名内容的边界矩形（逻辑坐标）
     *
     * 计算所有笔画的联合边界，用于图像裁剪。
     */
    QRect calculateSignatureBounds() const;

    /**
     * @brief 缩放点坐标
     * @param p 逻辑坐标点
     * @return 设备像素坐标点
     *
     * 将逻辑坐标转换为设备像素坐标，处理高DPI缩放。
     */
    QPointF scalePoint(const QPoint &p) const;

    // 状态变量
    bool m_isDrawing = false;       ///< 是否正在绘制
    bool m_transparentBg = false;   ///< 背景是否透明
    int m_smoothingLevel = 3;       ///< 平滑级别（0-5）

    // 图形资源
    QColor m_bgColor = Qt::white;   ///< 背景颜色
    QPen m_currentPen;              ///< 当前画笔
    QPixmap m_canvas;               ///< 双缓冲画布（存储签名图像）
    QPointF m_lastScaledPoint;      ///< 最后绘制的点（设备像素坐标）

    // 路径数据
    QPainterPath m_currentPath;     ///< 当前正在绘制的路径
    QStack<SignatureStroke> m_undoStack; ///< 撤销栈（存储已完成笔画）
    QStack<SignatureStroke> m_redoStack; ///< 重做栈（存储撤销的笔画）
};

#endif // SIGNATURELABEL_H
